#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>

using namespace std;
const int N = 1e5 + 10, INF = 1e8;

struct Node{
    int l, r;
    int key, val;
    int cnt, size;
}node[N];
int n;
int root, idx;

void pushup(int p){
    node[p].size = node[node[p].l].size + node[node[p].r].size + node[p].cnt;
}

int get_node(int key){
    idx++;
    node[idx].key = key;
    node[idx].size = node[idx].cnt = 1;
    node[idx].val = rand();
    return idx;
}

void zig(int &p){
    int q = node[p].l;
    node[p].l = node[q].r;
    node[q].r = p;
    p = q;
    pushup(node[p].r), pushup(p);
}    // 右旋

void zag(int &p){
    int q = node[p].r;
    node[p].r = node[q].l;
    node[q].l = p;
    p = q;
    pushup(node[p].l), pushup(p);
}    // 左旋

void build(){
    get_node(-INF), get_node(INF);
    root = 1;
    node[1].r = 2;
    pushup(root);

    if(node[1].val < node[2].val) zag(root);
}

void insert(int &p, int key){
    if(!p){
        p = get_node(key);
    }else if(node[p].key == key){
        node[p].cnt ++;
    }else if(node[p].key < key){
        insert(node[p].r, key);
        if(node[node[p].r].val > node[p].val) zag(p); 
    }else{
        insert(node[p].l, key);
        if(node[node[p].l].val > node[p].val) zig(p);
    }
    pushup(p);
}


void remove(int &p, int key){
    if(!p) return;
    if(node[p].key == key){
        if(node[p].cnt > 1) node[p].cnt --;
        else if(node[p].l || node[p].r){
            if(!node[p].r || node[node[p].l].val > node[node[p].r].val){
                zig(p);
                remove(node[p].r, key);
            }else{
                zag(p);
                remove(node[p].l, key);
            }
        }else{
            p = 0;
        }
    }else if(node[p].key > key){
        remove(node[p].l, key);
    }else{
        remove(node[p].r, key);
    }

    pushup(p);
}


int get_rank_by_key(int p, int key){

    if(node[p].key == key){
        return node[node[p].l].size + 1;
    }
    if(node[p].key > key){
        return get_rank_by_key(node[p].l, key);
    }

    return node[node[p].l].size + node[p].cnt + get_rank_by_key(node[p].r, key);

}    // 通过数值找排名


int get_key_by_rank(int p, int rank){
    if(node[node[p].l].size >= rank){
        return get_key_by_rank(node[p].l, rank);
    }

    if(node[node[p].l].size + node[p].cnt >= rank){
        return node[p].key;
    }

    return get_key_by_rank(node[p].r, rank - node[node[p].l].size - node[p].cnt);

}   // 通过排名找数值


int get_prev(int p, int key){
    if(!p)  return -INF;
    if(node[p].key >= key){
        return get_prev(node[p].l, key);
    }

    return max(node[p].key, get_prev(node[p].r, key));
}   // 找到严格小于key的最大数

int get_next(int p, int key){
    if(!p) return INF;
    if(node[p].key <= key){
        return get_next(node[p].r, key);
    }
    return min(node[p].key, get_next(node[p].l, key));
}    // 找到严格大于key的最小数

int main(){
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    build();

    scanf("%d", &n);
    while (n -- )
    {
        int opt, x;
        scanf("%d%d", &opt, &x);
        if (opt == 1) insert(root, x);
        else if (opt == 2) remove(root, x);
        else if (opt == 3) printf("%d\n", get_rank_by_key(root, x) - 1);
        else if (opt == 4) printf("%d\n", get_key_by_rank(root, x + 1));
        else if (opt == 5) printf("%d\n", get_prev(root, x));
        else printf("%d\n", get_next(root, x));
    }
    
    return 0;
}

